#include "chatserver.hpp"
#include "chatservice.hpp"
#include "json.hpp"
#include "muduo/base/Logging.h"

#include <nlohmann/json.hpp>
#include <functional>  // for std::bind()
#include <unistd.h>    // For sysconf()
#include <string>

using namespace std;
using namespace placeholders;
using json = nlohmann::json;

ChatServer::ChatServer(EventLoop *loop, const InetAddress &listenAddr, const string &nameArg)
    : _server(loop, listenAddr, nameArg), _loop(loop)
{
    // 注册链接回调
    _server.setConnectionCallback(std::bind(
        &ChatServer::onConnection, this, std::placeholders::_1));

    // 注册消息回调
    _server.setMessageCallback(std::bind(
        &ChatServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

    // 设置线程数据
    _server.setThreadNum(sysconf(_SC_NPROCESSORS_ONLN) + 1);

    // 启动服务
    
}

// 启动服务
void ChatServer::start()
{
    _server.start();
}

// 上报链接相关信息的回调函数
void ChatServer::onConnection(const TcpConnectionPtr &conn)
{
    // 客户端断开连接
    if (!conn->connected()) { 
        // 记录日志信息
        LOG_INFO << "Client disconnected: " << conn->peerAddress().toIpPort();

        // 调用单例模式下的 ChatService 实例的 clientCloseException 方法
        ChatService::getInstance()->clientCloseException(conn);
        conn->shutdown();
    } 
    else {
        // 如果连接成功，也可以在此处进行相应的处理
        // （例如记录日志、初始化某些资源等）
        LOG_INFO << "Client connected: " << conn->peerAddress().toIpPort();
    }   
}

// 上报读写事件相关信息的回调函数
void ChatServer::onMessage(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time)
{
    // 1.读取消息
    std::string buf = buffer->retrieveAllAsString();
    // 2.反序列化
    nlohmann::json js = nlohmann::json::parse(buf);
    // 3.获取消息ID
    int msgid = js["msgid"].get<int>();
    // 4.获取事件处理器：
    MsgHandler msgHandler = ChatService::getInstance()->getHandler(msgid);
    // 5.执行回调 来处理具体业务逻辑
    msgHandler(conn, js, time);
}




